import express from 'express'
import cors from 'cors'
import userRouter from './router/user.js'
import userInfoRouter from './router/userInfo.js'
import articleCateRouter from './router/artcate.js'
import articleRouter from './router/article.js'
import Joi from 'joi'
import { expressjwt } from 'express-jwt'
import { tokenSetting } from './config.js'
const app = express()
// 托管静态资源文件
app.use('/uploads', express.static('./uploads'))
// 跨域中间件
app.use(cors())
// 解析JSON数据中间件
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
// 自定义中间件,处理发送错误结果
app.use(function (req, res, next) {
    // 在所有的res对象挂载cc函数
    res.cc = function (err = '请求错误', status = 0) {
        res.send({
            status,
            message: err
        })
    }
    next()
})
// 自定义发送成功消息的中间件
app.use(function (req, res, next) {
    // 在所有的res对象挂载to函数
    res.to = function (msg = '请求成功', data = {}, status = 200) {
        if (Object.keys(data).length === 0) {
            res.send({
                status,
                message: msg
            })
        } else {
            res.send({
                status,
                message: msg,
                data
            })
        }
    }
    next()
})
// 配置解析token中间件
app.use(expressjwt({
    secret: tokenSetting.token_key,
    algorithms: ['HS256']
}
).unless({ path: [/^\/api\//] })
)

// 挂载路由
// 注册登录接口路由
app.use('/api', userRouter)
// 用户信息操作相关路由
app.use('/my', userInfoRouter)
// 文章分类名称操作路由
app.use('/article', articleCateRouter)
// 文章路由
app.use('/article', articleRouter)

// 定义全局处理错误中间件
app.use((err, req, res, next) => {
    // 处理验证表单数据的错误
    if (err instanceof Joi.ValidationError) {
        return res.cc(err.details[0].message)
    }
    // 处理token解析的错误
    if (err.name === 'UnauthorizedError') return res.status(401).cc('身份验证失败', 401)
    // 其他错误
    res.cc(err)
})
app.listen(3001, () => {
    console.log('服务器启动成功')
})